home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 5 / Gekikoh Dennoh Club Vol. 5 (Japan).7z / Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin / internet / webx / rbget020.lzh / RoboGet.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-09-27  |  6.5 KB  |  299 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/dos.h>
  5. #include <sys/iocs.h>
  6. #include <alloca.h>
  7. #include <time.h>
  8. #include <utime.h>
  9. #include <conio.h>
  10.  
  11. #include <network.h>
  12. #include <socket.h>
  13. #include "RoboGet.h"
  14. #include "WebCache/WebCache.h"
  15. #include "FuncUrl/FuncUrl.h"
  16.  
  17.  
  18. extern void Date2Date (char *, struct tm *);
  19. extern int GetFileInit (void);
  20. extern int GetFile (HTTPFILE *);
  21. extern void McPrint (char *);
  22. extern void McDbPrint (char *);
  23.  
  24.  
  25. /* âoâOé┴é─éαÄÇé╚é╚éóéµéñé╔ÄwÆΦé╖éΘÉöÆlé╔é═ù]ùTé≡Ä¥é╜é╣éΘüié▒é╠ÉöÆlé╔ì¬ïÆû│é╡üj */
  26. #define    YOYUU    1024
  27. /* -f âIâvâVâçâôÅëè·Æl */
  28. #define F_OPTION    32
  29.  
  30. /* URL é╠èKæwì\æóé≡ò█Ä¥ */
  31. typedef struct _url_nest {
  32.     struct _url_nest *before_ptr;    /* âèâXâgì\æó */
  33.     struct _url_nest *next_ptr;
  34.     char url[256];
  35. } URL_NEST;
  36.  
  37. /* èKæwì\æóÅεò± */
  38. typedef struct {
  39.     URL_NEST *url_nest_top;
  40.     URL_NEST *url_nest_end;
  41. } NEST_INFO;
  42.  
  43.  
  44. unsigned char quit_flag = QUIT_NON;
  45.  
  46. int v_option = 0;
  47. int f_option = F_OPTION;
  48. int f_option_left;
  49. unsigned char getfile_mode = GETFILE_CACHEHTMLONLY;
  50.  
  51. extern char cachedir[];
  52. NEST_INFO nest_info =
  53. {NULL, NULL};
  54.  
  55. int _stacksize = 32 * 1024;
  56. int _heapsize = 256 * 1024;
  57.  
  58. void usage (void)
  59. {
  60.     printf ("WWW Ä⌐ô«Åäë±â\âtâg RoboGet.X ver0.10\n"
  61.         "        programmed by Mitsuky <FreeSoftware>\n"
  62.         "URL é┼ÄwÆΦé│éΩé╜âtâ@âCâïé≡â_âEâôâìü[âhé╡é▄é╖üBì─ïAôIé╔â_âEâôé╖éΘÄûé¬ë┬ö\é┼é╖üB\n"
  63.         "Ägùpû@ : RoboGet [option] URL..."
  64.         "[option]\n"
  65.           "-fÉöÆl : ÄwÆΦé╡é╜âtâ@âCâïÉöé▓é╞é╔ WebCache.env é≡ò█æ╢é╖éΘüiâfâtâHâïâg = 32üj\n"
  66.         "-rÉöÆl : ì─ïAÉöüiâfâtâHâïâg = 0 : ì─ïAé╡é╚éóüj\n"
  67.         "    ÉöÆlé≡Å╚ù¬é╡é╜ÅΩìçé═ -r1 é╞î⌐é╚é╡é▄é╖\n"
  68.         "-v    : Å┌ì╫ò\ĪüiâfâoâbâOùpüj\n"
  69.         "URLé═òíÉöÄwÆΦé┼é½é▄é╖\n");
  70. }
  71.  
  72.  
  73. /* ûûö÷é╠âmü[âhé≡ìφÅ£é╖éΘ */
  74. void DeleteNode (URL_NEST ** url_nest_top, URL_NEST ** url_nest_end)
  75. {
  76.     if ((*url_nest_end)->before_ptr == NULL) {
  77.         /* éPé┬é╡é⌐é╚éóâmü[âhé≡ìφÅ£é╖éΘ */
  78.         free (*url_nest_end);
  79.         *url_nest_top = NULL;
  80.         *url_nest_end = NULL;
  81.     } else {
  82.         URL_NEST *t_ptr = *url_nest_end;
  83.         ((*url_nest_end)->before_ptr)->next_ptr = NULL;
  84.         *url_nest_end = (*url_nest_end)->before_ptr;
  85.         free (t_ptr);
  86.     }
  87. }
  88.  
  89.  
  90. /* ûûö÷é╔âmü[âhé≡éPé┬Æ╟ë┴é╖éΘ */
  91. int InsertNode (char *url, URL_NEST ** url_nest_top, URL_NEST ** url_nest_end)
  92. {
  93.     URL_NEST *i_ptr, *t_ptr;
  94.     if ((i_ptr = malloc (sizeof (URL_NEST))) == NULL) {
  95.         printf ("âüâéâèé¬æ½éΦé▄é╣é±\n");
  96.         return (-1);
  97.     } else {
  98.         if (*url_nest_top == NULL) {
  99.             /* âmü[âhéOî┬é╠Åèé╔Æ╟ë┴ */
  100.             *url_nest_top = i_ptr;
  101.             *url_nest_end = i_ptr;
  102.             i_ptr->before_ptr = NULL;
  103.             i_ptr->next_ptr = NULL;
  104.             strcpy (i_ptr->url, url);
  105.         } else {
  106.             /* ûûö÷é╔âmü[âhé≡Æ╟ë┴ */
  107.             (*url_nest_end)->next_ptr = i_ptr;
  108.             i_ptr->before_ptr = *url_nest_end;
  109.             i_ptr->next_ptr = NULL;
  110.             strcpy (i_ptr->url, url);
  111.             *url_nest_end = i_ptr;
  112.         }
  113.     }
  114.     t_ptr = *url_nest_top;
  115.  
  116.     return (0);
  117. }
  118.  
  119.  
  120. void McPrint (char *s)
  121. {
  122.     printf ("%s", s);
  123. }
  124.  
  125.  
  126. void McDbPrint (char *s)
  127. {
  128. //    printf ("%s", s);
  129. }
  130.  
  131.  
  132. void McCursorTop (void)
  133. {
  134.     printf ("\n\x1bM\x1b[2K");
  135. }
  136.  
  137.  
  138.  
  139. char QuitCheck (void)
  140. {
  141.     char r = QUIT_NON;
  142.     if (_iocs_bitsns (0) & 0b10) {    /* [ESC] âLü[ */
  143.         r = QUIT_ABORT;
  144.         _dos_kflushio (0xff);    /* âLü[âoâbâtâ@é≡âNâèâA */
  145.     }
  146.     if (_iocs_bitsns (0x0c) & 0b10) {    /* [BREAK] âLü[ */
  147.         r = QUIT_EXIT;
  148.         _dos_kflushio (0xff);    /* âLü[âoâbâtâ@é≡âNâèâA */
  149.     }
  150.     return (r);
  151. }
  152.  
  153.  
  154.  
  155. /* URL é┼ÄwÆΦé╡é╜âtâ@âCâïé≡ì─ïAôIé╔ĵé┴é─é¡éΘ */
  156. void GetFileRecursive (char *url, int r_option)
  157. {
  158.     char scheme[256], hostname[256], path[256], fname[256], query[256], anchor[256];
  159.     int port;
  160.     char temp_str[256];
  161.     char *r;
  162.     /* Éµô¬é╔ http:// é≡Æ╟ë┴üA'../'ôÖÅêù¥ì╧é▌üAquery é≡ìφÅ£é╡é╜ URL */
  163.     char temp_url[256];
  164.     HTTPFILE *httpfile;
  165.  
  166.     if (quit_flag != QUIT_NON)
  167.         return;
  168.  
  169.     printf ("%s é╠Ä≤ÉMé≡èJÄné╡é▄é╖\n", url);
  170.  
  171.     httpfile = alloca (sizeof (HTTPFILE));
  172.     httpfile->content = NULL;
  173.  
  174.     UrlSplit (url, scheme, hostname, path, fname, query, anchor, &port);
  175.     UrlCat (temp_url, scheme, hostname, path, fname, query, "", port);
  176.     strcpy (httpfile->url, temp_url);
  177.  
  178.     if (GetFile (httpfile) < 0)
  179.         return;
  180.  
  181.     /* HTML é≡ë≡É═é╡é─ì─ïAôIé╔â_âEâô */
  182.     if ((httpfile->content) && (r_option) && (!strcmp (httpfile->content_type, "text/html"))) {
  183.         r = httpfile->content;
  184.  
  185.         InsertNode (temp_url, &(nest_info.url_nest_top), &(nest_info.url_nest_end));
  186.         while ((r < (char *) (httpfile->content + httpfile->content_length)) && (quit_flag == QUIT_NON)) {
  187.             if (*r++ == '<') {
  188.                 if ((!strnicmp (r, "A HREF", 6))
  189.                     || (!strnicmp (r, "IMG SRC", 7))
  190.                     || (!strnicmp (r, "FRAME SRC", 9))) {
  191.                     char temp_str2[256], *r1 = r, *r2 = temp_str2;
  192.                     URL_NEST *t_ptr;
  193.                     char nest_match;
  194.  
  195.                     while (*r1++ != '"');
  196.                     if (!strnicmp (r1, "mailto:", 7))
  197.                         continue;
  198.                     while ((*r2++ = *r1++) != '"');
  199.                     *(r2 - 1) = '\0';
  200.                     r = r1;
  201.                     UrlCat (temp_str, scheme, hostname, path, temp_str2, query, "", port);
  202.  
  203.                     /* ì─ïAɵé¬Éeé╛é┴é╜éτì─ïAé╡é╚éóüiühû▀éΘühâ{â^âôé╔æ╬ë₧üj */
  204.                     nest_match = 0;
  205.                     if ((t_ptr = (nest_info.url_nest_top)) != NULL) {
  206.                         do {
  207.                             if (!stricmp (temp_str, t_ptr->url)) {
  208.                                 nest_match = !0;
  209.                                 break;
  210.                             }
  211.                         } while ((t_ptr = t_ptr->next_ptr) != NULL);
  212.                     }
  213.                     if (!nest_match) {
  214.                         GetFileRecursive (temp_str, r_option - 1);
  215.                         if (quit_flag == QUIT_ABORT)
  216.                             quit_flag = QUIT_NON;
  217.                     } else {
  218.                         printf ("    ì─ïAɵé¬Éeâtâ@âCâïé┼é╖ : ì─ïAé╡é▄é╣é±\n");
  219.                     }
  220.                 }
  221.             }
  222.         }
  223.         DeleteNode (&(nest_info.url_nest_top), &(nest_info.url_nest_end));
  224.     }
  225.     if (httpfile->content != NULL)
  226.         _dos_mfree (httpfile->content);
  227.  
  228.     return;
  229. }
  230.  
  231.  
  232.  
  233. int main (int argc, char *argv[])
  234. {
  235.     int i;
  236.     int slash_flag = 0;
  237.     int url_found_flag = 0;    /* âtâ@âCâïû╝é¬éPé┬é┼éαéáé┴é╜é⌐ */
  238.     int r_option = 0;    /* ì─ïAÉö */
  239.     int inetd_version;
  240.  
  241.     {
  242.         char *temp;
  243.  
  244.         temp = getenv ("SLASH");
  245.         if ((temp != NULL) && (*temp == '/')) {
  246.             slash_flag = 1;
  247.         }
  248.     }
  249.     WCInit ();
  250.     _dos_breakck (2);    /* BREAK â`âFâbâNé≡ÄEé╖ */
  251.     inetd_version = _get_version ();
  252.  
  253.     for (i = 1; i < argc; i++) {
  254.         if (('-' == *argv[i]) || ((slash_flag == 0) && ('/' == *argv[i]))) {
  255.             switch (*(argv[i] + 1)) {
  256.  
  257.             case 'f':
  258.             case 'F':
  259.                 sscanf (argv[i] + 2, "%d", &f_option);
  260.                 break;
  261.  
  262.             case 'r':
  263.             case 'R':
  264.                 sscanf (argv[i] + 2, "%d", &r_option);
  265.                 if (!r_option)
  266.                     r_option = 1;
  267.                 break;
  268.  
  269.             case 'v':
  270.             case 'V':
  271.                 v_option = !0;
  272.                 break;
  273.  
  274.             default:
  275.                 usage ();
  276.                 return (-1);
  277.             }
  278.         } else {
  279.             url_found_flag = 1;
  280.             f_option_left = f_option;
  281.             if (inetd_version < 0) {
  282.                 printf ("TCP/IP âhâëâCâoé¬ÅφÆôé╡é─éóé▄é╣é±üB\n");
  283.                 break;
  284.             } else {
  285.                 GetFileRecursive (argv[i], r_option);
  286.             }
  287.         }
  288.     }
  289.  
  290.     if (url_found_flag == 0) {
  291.         usage ();
  292.         return (-1);
  293.     }
  294.     WCTini ();
  295.     _dos_kflushio (0xff);    /* âLü[âoâbâtâ@é≡âNâèâA */
  296.  
  297.     return (0);
  298. }
  299.